home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2000 March / maximum-cd-2000-03.iso / Quake3 Game Source / Q3AGameSource.exe / Main / ui_demo2.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-01-18  |  7.1 KB  |  270 lines

  1. // Copyright (C) 1999-2000 Id Software, Inc.
  2. //
  3. /*
  4. =======================================================================
  5.  
  6. DEMOS MENU
  7.  
  8. =======================================================================
  9. */
  10.  
  11.  
  12. #include "ui_local.h"
  13.  
  14.  
  15. #define ART_BACK0            "menu/art/back_0"
  16. #define ART_BACK1            "menu/art/back_1"    
  17. #define ART_GO0                "menu/art/play_0"
  18. #define ART_GO1                "menu/art/play_1"
  19. #define ART_FRAMEL            "menu/art/frame2_l"
  20. #define ART_FRAMER            "menu/art/frame1_r"
  21. #define ART_ARROWS            "menu/art/arrows_horz_0"
  22. #define ART_ARROWLEFT        "menu/art/arrows_horz_left"
  23. #define ART_ARROWRIGHT        "menu/art/arrows_horz_right"
  24.  
  25. #define MAX_DEMOS            128
  26. #define NAMEBUFSIZE            ( MAX_DEMOS * 16 )
  27.  
  28. #define ID_BACK                10
  29. #define ID_GO                11
  30. #define ID_LIST                12
  31. #define ID_RIGHT            13
  32. #define ID_LEFT                14
  33.  
  34. #define ARROWS_WIDTH        128
  35. #define ARROWS_HEIGHT        48
  36.  
  37.  
  38. typedef struct {
  39.     menuframework_s    menu;
  40.  
  41.     menutext_s        banner;
  42.     menubitmap_s    framel;
  43.     menubitmap_s    framer;
  44.  
  45.     menulist_s        list;
  46.  
  47.     menubitmap_s    arrows;
  48.     menubitmap_s    left;
  49.     menubitmap_s    right;
  50.     menubitmap_s    back;
  51.     menubitmap_s    go;
  52.  
  53.     int                numDemos;
  54.     char            names[NAMEBUFSIZE];
  55.     char            *demolist[MAX_DEMOS];
  56. } demos_t;
  57.  
  58. static demos_t    s_demos;
  59.  
  60.  
  61. /*
  62. ===============
  63. Demos_MenuEvent
  64. ===============
  65. */
  66. static void Demos_MenuEvent( void *ptr, int event ) {
  67.     if( event != QM_ACTIVATED ) {
  68.         return;
  69.     }
  70.  
  71.     switch( ((menucommon_s*)ptr)->id ) {
  72.     case ID_GO:
  73.         UI_ForceMenuOff ();
  74.         trap_Cmd_ExecuteText( EXEC_APPEND, va( "demo %s.dm3\n", s_demos.list.itemnames[s_demos.list.curvalue] ) );
  75.         break;
  76.  
  77.     case ID_BACK:
  78.         UI_PopMenu();
  79.         break;
  80.  
  81.     case ID_LEFT:
  82.         ScrollList_Key( &s_demos.list, K_LEFTARROW );
  83.         break;
  84.  
  85.     case ID_RIGHT:
  86.         ScrollList_Key( &s_demos.list, K_RIGHTARROW );
  87.         break;
  88.     }
  89. }
  90.  
  91.  
  92. /*
  93. =================
  94. UI_DemosMenu_Key
  95. =================
  96. */
  97. static sfxHandle_t UI_DemosMenu_Key( int key ) {
  98.     menucommon_s    *item;
  99.  
  100.     item = Menu_ItemAtCursor( &s_demos.menu );
  101.  
  102.     return Menu_DefaultKey( &s_demos.menu, key );
  103. }
  104.  
  105.  
  106. /*
  107. ===============
  108. Demos_MenuInit
  109. ===============
  110. */
  111. static void Demos_MenuInit( void ) {
  112.     int        i;
  113.     int        len;
  114.     char    *demoname;
  115.  
  116.     memset( &s_demos, 0 ,sizeof(demos_t) );
  117.     s_demos.menu.key = UI_DemosMenu_Key;
  118.  
  119.     Demos_Cache();
  120.  
  121.     s_demos.menu.fullscreen = qtrue;
  122.     s_demos.menu.wrapAround = qtrue;
  123.  
  124.     s_demos.banner.generic.type        = MTYPE_BTEXT;
  125.     s_demos.banner.generic.x        = 320;
  126.     s_demos.banner.generic.y        = 16;
  127.     s_demos.banner.string            = "DEMOS";
  128.     s_demos.banner.color            = color_white;
  129.     s_demos.banner.style            = UI_CENTER;
  130.  
  131.     s_demos.framel.generic.type        = MTYPE_BITMAP;
  132.     s_demos.framel.generic.name        = ART_FRAMEL;
  133.     s_demos.framel.generic.flags    = QMF_INACTIVE;
  134.     s_demos.framel.generic.x        = 0;  
  135.     s_demos.framel.generic.y        = 78;
  136.     s_demos.framel.width            = 256;
  137.     s_demos.framel.height            = 329;
  138.  
  139.     s_demos.framer.generic.type        = MTYPE_BITMAP;
  140.     s_demos.framer.generic.name        = ART_FRAMER;
  141.     s_demos.framer.generic.flags    = QMF_INACTIVE;
  142.     s_demos.framer.generic.x        = 376;
  143.     s_demos.framer.generic.y        = 76;
  144.     s_demos.framer.width            = 256;
  145.     s_demos.framer.height            = 334;
  146.  
  147.     s_demos.arrows.generic.type        = MTYPE_BITMAP;
  148.     s_demos.arrows.generic.name        = ART_ARROWS;
  149.     s_demos.arrows.generic.flags    = QMF_INACTIVE;
  150.     s_demos.arrows.generic.x        = 320-ARROWS_WIDTH/2;
  151.     s_demos.arrows.generic.y        = 400;
  152.     s_demos.arrows.width            = ARROWS_WIDTH;
  153.     s_demos.arrows.height            = ARROWS_HEIGHT;
  154.  
  155.     s_demos.left.generic.type        = MTYPE_BITMAP;
  156.     s_demos.left.generic.flags        = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_MOUSEONLY;
  157.     s_demos.left.generic.x            = 320-ARROWS_WIDTH/2;
  158.     s_demos.left.generic.y            = 400;
  159.     s_demos.left.generic.id            = ID_LEFT;
  160.     s_demos.left.generic.callback    = Demos_MenuEvent;
  161.     s_demos.left.width                = ARROWS_WIDTH/2;
  162.     s_demos.left.height                = ARROWS_HEIGHT;
  163.     s_demos.left.focuspic            = ART_ARROWLEFT;
  164.  
  165.     s_demos.right.generic.type        = MTYPE_BITMAP;
  166.     s_demos.right.generic.flags        = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_MOUSEONLY;
  167.     s_demos.right.generic.x            = 320;
  168.     s_demos.right.generic.y            = 400;
  169.     s_demos.right.generic.id        = ID_RIGHT;
  170.     s_demos.right.generic.callback    = Demos_MenuEvent;
  171.     s_demos.right.width                = ARROWS_WIDTH/2;
  172.     s_demos.right.height            = ARROWS_HEIGHT;
  173.     s_demos.right.focuspic            = ART_ARROWRIGHT;
  174.  
  175.     s_demos.back.generic.type        = MTYPE_BITMAP;
  176.     s_demos.back.generic.name        = ART_BACK0;
  177.     s_demos.back.generic.flags        = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
  178.     s_demos.back.generic.id            = ID_BACK;
  179.     s_demos.back.generic.callback    = Demos_MenuEvent;
  180.     s_demos.back.generic.x            = 0;
  181.     s_demos.back.generic.y            = 480-64;
  182.     s_demos.back.width                = 128;
  183.     s_demos.back.height                = 64;
  184.     s_demos.back.focuspic            = ART_BACK1;
  185.  
  186.     s_demos.go.generic.type            = MTYPE_BITMAP;
  187.     s_demos.go.generic.name            = ART_GO0;
  188.     s_demos.go.generic.flags        = QMF_RIGHT_JUSTIFY|QMF_PULSEIFFOCUS;
  189.     s_demos.go.generic.id            = ID_GO;
  190.     s_demos.go.generic.callback        = Demos_MenuEvent;
  191.     s_demos.go.generic.x            = 640;
  192.     s_demos.go.generic.y            = 480-64;
  193.     s_demos.go.width                = 128;
  194.     s_demos.go.height                = 64;
  195.     s_demos.go.focuspic                = ART_GO1;
  196.  
  197.     s_demos.list.generic.type        = MTYPE_SCROLLLIST;
  198.     s_demos.list.generic.flags        = QMF_PULSEIFFOCUS;
  199.     s_demos.list.generic.callback    = Demos_MenuEvent;
  200.     s_demos.list.generic.id            = ID_LIST;
  201.     s_demos.list.generic.x            = 118;
  202.     s_demos.list.generic.y            = 130;
  203.     s_demos.list.width                = 16;
  204.     s_demos.list.height                = 14;
  205.     s_demos.list.numitems            = trap_FS_GetFileList( "demos", "dm3", s_demos.names, NAMEBUFSIZE );
  206.     s_demos.list.itemnames            = (const char **)s_demos.demolist;
  207.     s_demos.list.columns            = 3;
  208.  
  209.     if (!s_demos.list.numitems) {
  210.         strcpy( s_demos.names, "No Demos Found." );
  211.         s_demos.list.numitems = 1;
  212.  
  213.         //degenerate case, not selectable
  214.         s_demos.go.generic.flags |= (QMF_INACTIVE|QMF_HIDDEN);
  215.     }
  216.     else if (s_demos.list.numitems > MAX_DEMOS)
  217.         s_demos.list.numitems = MAX_DEMOS;
  218.  
  219.     demoname = s_demos.names;
  220.     for ( i = 0; i < s_demos.list.numitems; i++ ) {
  221.         s_demos.list.itemnames[i] = demoname;
  222.         
  223.         // strip extension
  224.         len = strlen( demoname );
  225.         if (!Q_stricmp(demoname +  len - 4,".dm3"))
  226.             demoname[len-4] = '\0';
  227.  
  228.         Q_strupr(demoname);
  229.  
  230.         demoname += len + 1;
  231.     }
  232.  
  233.     Menu_AddItem( &s_demos.menu, &s_demos.banner );
  234.     Menu_AddItem( &s_demos.menu, &s_demos.framel );
  235.     Menu_AddItem( &s_demos.menu, &s_demos.framer );
  236.     Menu_AddItem( &s_demos.menu, &s_demos.list );
  237.     Menu_AddItem( &s_demos.menu, &s_demos.arrows );
  238.     Menu_AddItem( &s_demos.menu, &s_demos.left );
  239.     Menu_AddItem( &s_demos.menu, &s_demos.right );
  240.     Menu_AddItem( &s_demos.menu, &s_demos.back );
  241.     Menu_AddItem( &s_demos.menu, &s_demos.go );
  242. }
  243.  
  244. /*
  245. =================
  246. Demos_Cache
  247. =================
  248. */
  249. void Demos_Cache( void ) {
  250.     trap_R_RegisterShaderNoMip( ART_BACK0 );
  251.     trap_R_RegisterShaderNoMip( ART_BACK1 );
  252.     trap_R_RegisterShaderNoMip( ART_GO0 );
  253.     trap_R_RegisterShaderNoMip( ART_GO1 );
  254.     trap_R_RegisterShaderNoMip( ART_FRAMEL );
  255.     trap_R_RegisterShaderNoMip( ART_FRAMER );
  256.     trap_R_RegisterShaderNoMip( ART_ARROWS );
  257.     trap_R_RegisterShaderNoMip( ART_ARROWLEFT );
  258.     trap_R_RegisterShaderNoMip( ART_ARROWRIGHT );
  259. }
  260.  
  261. /*
  262. ===============
  263. UI_DemosMenu
  264. ===============
  265. */
  266. void UI_DemosMenu( void ) {
  267.     Demos_MenuInit();
  268.     UI_PushMenu( &s_demos.menu );
  269. }
  270.